package cn.hinglo.zuul.fillter;

import cn.hinglo.common.utils.ResultUtils;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;

import javax.servlet.http.HttpServletRequest;


/**
 * @createTime: 2018/9/19 9:59
 * @author: HingLo
 * @description: 网关路由过滤, 规则处理等相关事宜
 */
// @Component
@Slf4j
public class LoginFilter extends ZuulFilter {

    /**
     * pre：可以在请求被路由之前调用。 routing：在路由请求时候被调用。 post：在routing和error过滤器之后被调用。 error：处理请求时发生错误时被调用。
     *
     * @return 返回过滤类型
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 定义执行顺序
     *
     * @return 返回定义顺序, 越低执行越优先级越高
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /***
     * 判断该过滤器是否需要被执行。这里我们直接返回了true，因此该过滤器对所有请求都会生效。实际运用中我们可以利用该函数来指定过滤器的有效范围。
     *
     * @return 返回那些路由应该被拦截执行
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 具体的过滤逻辑
     *
     * @return 返回结果
     */
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String token = request.getHeader("accessToken");
        if (StrUtil.isBlank(token)) {
            // 设置不在执行下一个filter
            ctx.set("isSuccess", false);
            // 告诉zuul不需要将当前请求转发到后端的服务了
            ctx.setSendZuulResponse(false);
            // 设置响应结果
            ctx.setResponseBody(JSONUtil.toJsonStr(ResultUtils.error("账号未登录,请登录有重试")));
            ctx.getResponse().setContentType("application/json; charset=utf-8");
            ctx.setResponseStatusCode(HttpStatus.OK.value());
        }
        return null;
    }
}
